{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 机器读心术之神经网络与深度学习第7课书面作业\n",
    "学号：207567\n",
    "\n",
    "**书面作业：**  \n",
    "1. 简要解释《Restricted Boltzmann Machines for Collaborative Filtering》论文中，Figure 2 所指的“Conditional RBM”模型的具体构成和意义\n",
    "2. （可选）同上文，阐述公式（7）所表达的算法的具体含义"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 作业1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "论文中的conditional RBM以及Figure 2所指，在我理解来看就是对看了的但是评分结果是“Missing”数据的建模，按论文中说法，如果用户看了这部电影，但是没有评分，这个信息对最终的预测结果是很大影响的，而conditional RBM就是针对这类数据的建模。具体建模的方法是，构建了一个长度为所有电影（M）的二值向量R，其中0表示没有看过，1表示看过了，向量中的每一项都有权值与隐层节点相连，这部分权值称为D。  \n",
    "在用CD算法训练时，也要同时训练D的权值。  \n",
    "其实在我看来就是在原来可见层增加了一个维度，原来$v_i$只有$K$个维度，现在增加到$K+1$维度，这个新增的$K+1$维表示第$i$部电影有没有被看过，同时这个新增的维度不参与\"softmax\"计算。  \n",
    "从论文中看这样处理后，预测性能有提升。  \n",
    "其实也可以这样理解，相当于如果没有这么做等于将知道有电影看过但是没有评分信息直接丢弃了，直观地理解利用它来增强预测应该效果会好。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 作业2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可见层集合为$\\mathbf{V}$, 这里加入一个新的节点$v_q$，也就是要预测评分的新电影，假设我们只考虑$v_q$的第k评分，这时我们得到一个新的可见层集合$\\mathbf{V^*}=\\{v_q^k,\\mathbf{V}\\}$,根据论文中公式(3)，我们有："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\n",
    "\\begin{align*}\n",
    "p(\\mathbf{V^*})=p(v_q^k,\\mathbf{V})=\\sum_h\\frac{\\exp(-E(v_q^k,\\mathbf{V,h}))}{\\sum_{\\mathbf{V'',h'}}\\exp(-E(\\mathbf{V'',h'}))} \\tag{7.1}\n",
    "\\end{align*}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上式(7.1)中为了与原论文中公式区分，引入了$\\mathbf{V''}$，$\\mathbf{V''}$是包含$v_q^k$和$\\mathbf{V}$的。能量函数中也要引入$v_q^k$："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\n",
    "E(v_q^k,\\mathbf{V,h})= - \\sum_{i=1}^m\\sum_{j=1}^F\\sum_{o=1}^K W_{ij}^oh_jv_i^o -\\sum_{j=1}^F W_{qj}^kh_jv_q^k +\\sum_{i=1}^m\\log Z_i - \\sum_{i=1}^m\\sum_{o=1}^Kv_i^ob_i^o -v_q^kb_q^k- \\sum_{j=1}^Fh_jb_j \\tag{7.2}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们根据公式(7.1)，利用贝叶斯公式得到："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\n",
    "p(v_q^k=1|\\mathbf{V})=\\frac{p(v_q^k=1,\\mathbf{V})}{p(\\mathbf{V})} \\tag{7.3}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "因为$v_q^k$只有0和1两种取值，根据(7.2)式可知："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\n",
    "p(v_q^k,\\mathbf{V}) = p(v_q^k=1,\\mathbf{V})\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "根据上式结合(7.3)："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\n",
    "\\begin{align*}\n",
    "p(v_q^k=1|\\mathbf{V})&=\\frac{p(v_q^k,\\mathbf{V})}{p(\\mathbf{V})} \\\\\n",
    "&=\\frac{\\sum_h\\frac{\\exp(-E(v_q^k,\\mathbf{V,h}))}{\\sum_{\\mathbf{V'',h'}}\\exp(-E(\\mathbf{V'',h'}))}}{p(\\mathbf{V})}    \\;\\;\\;\\;\\;\\;对于给定\\mathbf{V}, p(\\mathbf{V})可认为是常数, 而\\sum_{\\mathbf{V'',h'}}\\exp(-E(\\mathbf{V'',h'}))是归一化系数\\\\\n",
    "&\\propto \\exp(-E(v_q^k,\\mathbf{V,h}))\n",
    "\\end{align*}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上式即对应论文中公式(7)"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "fb9f349487484364a76a86d689de2291b320d01c749a280950eb5136d479374c"
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
